﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Model;
using Model.Models;
using Persistence;
namespace Services
{
    /// <summary>
    /// Gerencia todas as regras de negócio da entidade Cliente
    /// </summary>
    public class GerenciadorCliente
    {
        private IUnitOfWork unitOfWork;
        private bool shared;

        public GerenciadorCliente()
        {
            this.unitOfWork = new UnitOfWork();
            shared = false;
        }

        internal GerenciadorCliente(IUnitOfWork unitOfword)
        {
            this.unitOfWork = unitOfword;
            shared = true;
        }

        public int Inserir(Cliente clienteModel)
        {
            TB_CLIENTE clienteE = new TB_CLIENTE();
            Atribuir(clienteModel, clienteE);
            unitOfWork.RepositorioCliente.Inserir(clienteE);
            unitOfWork.Commit(shared);
            return clienteE.id_Cliente;

        }


        public void Editar(Cliente clienteModel)
        {
            TB_CLIENTE clienteE = new TB_CLIENTE();
            Atribuir(clienteModel, clienteE);
            unitOfWork.RepositorioCliente.Editar(clienteE);
            unitOfWork.Commit(shared);
        }

        public void Remover(int idCliente)
        {
            unitOfWork.RepositorioCliente.Remover(cliente => cliente.id_Cliente.Equals(idCliente));
            unitOfWork.Commit(shared);

        }

        private IQueryable<Cliente> GetQuery()
        {
            IQueryable<TB_CLIENTE> tb_cliente = unitOfWork.RepositorioCliente.GetQueryable();
            var query = from cliente in tb_cliente
                        select new Cliente
                        {
                            Id_Cliente = cliente.id_Cliente,
                            Nome = cliente.nome,
                            Cpf = cliente.cpf,
                            Email = cliente.email,
                            Senha = cliente.senha,
                            Telefone = cliente.telefone,
                            Rua = cliente.rua,
                            Numero = cliente.numero,
                            Bairro = cliente.bairro,
                            Cep = cliente.cep,
                            Cidade = cliente.cidade,
                            Estado = cliente.estado
                        };
            return query;
        }

        public IEnumerable<Cliente> ObterTodos()
        {
            return GetQuery();
        }

        public Cliente Obter(int idCliente)
        {
            IEnumerable<Cliente> clienteEs = GetQuery().Where(clienteModel => clienteModel.Id_Cliente.Equals(idCliente));
            return clienteEs.ElementAtOrDefault(0);
        }


        private void Atribuir(Cliente clienteModel, TB_CLIENTE clienteE)
        {
            clienteE.id_Cliente = clienteModel.Id_Cliente;
            clienteE.nome = clienteModel.Nome;
            clienteE.cpf = clienteModel.Cpf;
            clienteE.email = clienteModel.Email;
            clienteE.senha = clienteModel.Senha;
            clienteE.telefone = clienteModel.Telefone;
            clienteE.rua = clienteModel.Rua;
            clienteE.numero = clienteModel.Numero;
            clienteE.bairro = clienteModel.Bairro;
            clienteE.cep = clienteModel.Cep;
            clienteE.cidade = clienteModel.Cidade;
            clienteE.estado = clienteModel.Estado;
        }
    }
}